package com.hqyj.config;

import com.hqyj.callback.MqConfirm;
import com.hqyj.callback.MqReturn;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * 项目:rabbitmq-230301-provider
 * 描述: 主题交换机配置
 * 时间:2023/8/3 15:03
 * 作者:admin
 * 版本:1.0
 **/
//@Configuration
public class MyRabbitmqTopicConfig {

    /**
     * 消息转换器
     * @return
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 消息队列配置
     * @return
     */
    @Bean
    public Queue queue01(){
        /**
         * 1. Name，队列的名字；
         * 2. Durable，默认false, 队列是否持久化。为真时，即使 broker 重启时，此 Queue 也不会删除；
         * 3. Exclusive，默认false，队列是否独占。为真时，表示此 Queue 只能有一个消费者，并且此消费者的连接断开时，此 Queue 会被删除。
         * 4. Auto-delete，默认false，为真时，此 Queue会在最后一个消费者取消订阅时被删除
         */
        return  new Queue("queue03",true,false,false);
    }
    /**
     * 消息队列配置
     * @return
     */
    @Bean
    public Queue queue02(){
        /**
         * 1. Name，队列的名字；
         * 2. Durable，默认false, 队列是否持久化。为真时，即使 broker 重启时，此 Queue 也不会删除；
         * 3. Exclusive，默认false，队列是否独占。为真时，表示此 Queue 只能有一个消费者，并且此消费者的连接断开时，此 Queue 会被删除。
         * 4. Auto-delete，默认false，为真时，此 Queue会在最后一个消费者取消订阅时被删除
         */
        return  new Queue("queue04",true,false,false);
    }

    /**
     * 交换机配置
     * @return
     */
    @Bean
    public TopicExchange getDExchange(){
        /**
         * 1. Name，Exchange 的名字；
         * 2. Durability，是否是持久的 Exchange，当为真时，broker 重启后也会保留此 Exchange；
         * 3. Auto-delte，当为真时，如果所有绑定的 Queue 都不再使用时，此 Exchange 会自动删除。
         */
        return new TopicExchange("topicExchange",true,false);
    }

    /**
     * 队列queue01绑定交换机
     * @return
     */
    @Bean
    public Binding bindingQueue(){
        return BindingBuilder.bind(queue01()).to(getDExchange()).with("topic.#");
    }

    /**
     * 队列queue02绑定交换机
     * @return
     */
    @Bean
    public Binding bindingQueue01(){
        return BindingBuilder.bind(queue02()).to(getDExchange()).with("www.#");
    }

    @Autowired
    MqConfirm mqConfirm;
    @Autowired
    MqReturn mqReturn;
    @Autowired
    RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(mqConfirm);
        rabbitTemplate.setReturnCallback(mqReturn);
    }


}
